/**
 * 有意思的代码
 */


// 如何证明自己很牛逼
// console.log(([][[]] + [])[+!![]] + ([] + {})[!+[] + !![]]);


// 优雅的错误处理 显然天朝不适用
try {
    // somesting
} catch (e) {
    window.location.href = 'https://stackoverflow.com/search?q=[js]+' + e.message;
}


// 单行写一个评级组件："★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);
// 定义一个变量rate是1到5的值，然后执行上面代码


// 亚马逊服务器设置
// https://bbs.feng.com/read-htm-tid-10622429.html
// ss 服务
// http://blog.csdn.net/roland_sun/article/details/51279522 8388
// git merge master

// ssserver -c /etc/shadowsocks.json -d start 或者 stop

// 一个好玩儿的下拉框
// https://xbt1.github.io/effect-dropdown-vue/


// http://bigjpg.com/ 放大图片的网站


// '我'.charCodeAt(0).toString(16)

/**
 * 千位数加逗号
 *
 * @param {string} value 字符串
 * @return {string} 加逗号后的字符
 */
const withSeparator = value =>
  Number(value).toString().replace(/\d{1,3}(?=(\d{3})+$)/g, s => `${s},`);

'1234567890'.replace(/\B(?=(?:\d{3})+(?!\d))/g,",")


 // 防止内存泄漏
 //在定义事件处理函数的外部函数中，删除对dom的引用
 function bindEvent(){
   var obj=document.createElement("XXX");
   obj.onclick=function(){
     //Even if it's a empty function
   }
   obj=null;
 }


 // react 前后端分离 服务器端渲染
 // https://github.com/chikara-chan/react-isomorphic-boilerplate
 // http://www.redux.org.cn/docs/recipes/ServerRendering.html


 // 具有用的地图
 // http://maptalks.org/


 // 位运算 应用 色彩转换
 function hexToRGB(hex){
  var hex = hex.replace('#','0x'),
      r = hex >> 16,
      g = hex >> 8 & 0xff,
      b = hex & 0xff;
  return 'rgb('+r+','+g+','+b+')';
}

function RGBToHex(rgb){
  var rgbArr = rgb.split(/[^\d]+/),
      color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3];
  return "#"+color.toString(16);
}

// 任意两点之间的距离
function calcDistance(loc1, loc2) {
  return Math.sqrt( Math.pow((loc1.x - loc2.x), 2) + Math.pow((loc1.y - loc2.y), 2) )
}


// gitBook 一些操作
// https://zhuanlan.zhihu.com/p/34946169
// https://segmentfault.com/a/1190000017960359
// https://segmentfault.com/a/1190000019806829
// https://www.cnblogs.com/mingyue5826/p/10307051.html


// border动画
// https://codepen.io/Mamboleoo/pen/zYOJOGb


// 判断是否支持webp格式图片 支持 返回true   不支持 返回false
function check_support_webp() {
  return document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
}

// 花式替换
const urls = urls.replace( /^(http(?:s)?:\/\/)(.*)/gi, (str, $1, $2) => `https://${$2}`);

// 回车 '\u000a'

// 过滤控制符
'中间有个\u000a回车'.replace(/[\x00-\x1f]+/g, '');


// 快速格式化表单
const serializeForm = form => Array.from(new FormData(form), field => field.map(encodeURIComponent).join('=')).join('&');
// EXAMPLES
serializeForm(document.querySelector('#form')); // email=test%40email.com&name=Test%20Name


// @ts-nocheck
const scrollToTop = (top = 0, callbacks) => {
  if (!window.requestAnimationFrame) {
    window.requestAnimationFrame = callback => setTimeout(callback, 17);
  }
  // 当前滚动高度
  let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  // 滚动step方法
  const step = () => {
    // 距离目标滚动距离
    const distance = top - scrollTop;
    // 目标滚动位置
    scrollTop += distance / 8;
    if (Math.abs(distance) < 1) {
      window.scrollTo(0, top);
    } else {
      window.scrollTo(0, scrollTop);
      requestAnimationFrame(step);
    }
  };
  step();
  if (callbacks) {
    callbacks();
  }
};

const scrollTo = (element, x) => {
  if (!window.requestAnimationFrame) {
    window.requestAnimationFrame = callback => setTimeout(callback, 17);
  }
  // 当前滚动高度
  let scrollX = element.scrollLeft;
  // 滚动step方法
  const step = () => {
    // 距离目标滚动距离
    const distanceX = x - scrollX;
    // 目标滚动位置
    scrollX += distanceX / 6;
    if (Math.abs(distanceX) < 1) {
      element.scrollTo(x, 0);
    } else {
      element.scrollTo(scrollX, 0);
      requestAnimationFrame(step);
    }
  };
  step();
};
